package com.wg.db;

import cn.hutool.core.date.DateUtil;
import com.wg.core.exception.UnrealizedException;

import java.util.Date;

/**
 * 时间格式化与偏移的单位枚举
 *
 * @author 少爷123
 */
public enum FormatTimeUnit {
    /**
     * 无时间单位（调用方法会抛出异常）
     */
    NONE {
        @Override
        public String getFormatStr() {
            throw new UnrealizedException("NONE时间单位不支持格式化");
        }

        @Override
        public Date offset(Date date, int increase) {
            throw new UnrealizedException("NONE时间单位不支持时间偏移");
        }
    },
    /**
     * 分钟级时间单位（格式：年月日时分，24小时制）
     * 示例：202508201530 表示2025年8月20日15时30分
     */
    MINUTES {
        @Override
        public String getFormatStr() {
            // 使用HH表示24小时制（原hh为12小时制）
            return "yyyyMMddHHmm";
        }

        @Override
        public Date offset(Date date, int increase) {
            return DateUtil.offsetMinute(date, increase); // 分钟偏移
        }
    },
    /**
     * 小时级时间单位（格式：年月日时，24小时制）
     * 示例：2025082015 表示2025年8月20日15时
     */
    HOURS {
        @Override
        public String getFormatStr() {
            // 使用HH表示24小时制（原hh为12小时制）
            return "yyyyMMddHH";
        }

        @Override
        public Date offset(Date date, int increase) {
            return DateUtil.offsetHour(date, increase); // 小时偏移
        }
    },
    /**
     * 天级时间单位（格式：年月日）
     * 示例：20250820 表示2025年8月20日
     */
    DAYS {
        @Override
        public String getFormatStr() {
            return "yyyyMMdd";
        }

        @Override
        public Date offset(Date date, int increase) {
            return DateUtil.offsetDay(date, increase); // 天偏移
        }
    },
    /**
     * 月级时间单位（格式：年月）
     * 示例：202508 表示2025年8月
     */
    MONTH {
        @Override
        public String getFormatStr() {
            return "yyyyMM";
        }

        @Override
        public Date offset(Date date, int increase) {
            return DateUtil.offsetMonth(date, increase); // 月偏移（自动处理月末日期）
        }
    };

    /**
     * 获取时间格式化字符串
     *
     * @return 时间格式（如yyyyMMddHHmm）
     */
    public abstract String getFormatStr();

    /**
     * 对日期进行偏移操作
     *
     * @param date     原始日期
     * @param increase 偏移量（正数为未来，负数为过去）
     * @return 偏移后的日期
     */
    public abstract Date offset(Date date, int increase);
}